/*
 ============================================================================
 Name        : Serializer.c
 Author      : SOogle
 Version     : 1.0
 Copyright   : All rights reserved
 Description : FUSELAGE - FUSE FAT32 FILE SYSTEM
 ============================================================================
 */

#include "../../headers/GlobalHeader.h"

t_stream *RespuestaINFO_serializer(protocoloINFO_respuesta *respuesta){

	char *data = malloc(sizeof(respuesta->cabecera)+sizeof(respuesta->posicionActual));
	t_stream *stream = malloc(sizeof(t_stream));
	int32_t offset, tmp_size = 0;

	memcpy(data, &respuesta->cabecera.type, tmp_size = sizeof(int32_t));

	offset = tmp_size;
	memcpy(data+offset, &respuesta->cabecera.payloadlength, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, &respuesta->posicionActual, tmp_size = sizeof(int32_t));

	stream->length = offset + tmp_size;
	stream->data = data;

	return stream;
}

t_stream *RespuestaCLEAN_serializer(protocoloCLEAN_respuesta *respuesta){

	char *data = malloc(sizeof(respuesta->cabecera)+sizeof(respuesta->respuestaClean));
	t_stream *stream = malloc(sizeof(t_stream));
	int32_t offset, tmp_size = 0;

	memcpy(data, &respuesta->cabecera.type, tmp_size = sizeof(int32_t));

	offset = tmp_size;
	memcpy(data+offset, &respuesta->cabecera.payloadlength, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, &respuesta->respuestaClean, tmp_size = sizeof(int32_t));

	stream->length = offset + tmp_size;
	stream->data = data;

	return stream;
}

t_stream *RespuestaTRACE_serializer(protocoloTRACE_respuesta *respuesta, int32_t cantidadSectores){

	char *data = malloc(sizeof(respuesta->cabecera)+sizeof(respuesta->payload)+cantidadSectores*sizeof(int32_t));
	t_stream *stream = malloc(sizeof(t_stream));
	int32_t offset, tmp_size = 0;

	memcpy(data, &respuesta->cabecera.type, tmp_size = sizeof(int32_t));

	offset = tmp_size;
	memcpy(data+offset, &respuesta->cabecera.payloadlength, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, &respuesta->payload.posicionActual, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, &respuesta->payload.sectorSolicitado, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, &respuesta->payload.tiempoConsumido, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, &respuesta->payload.proximoSector, tmp_size = sizeof(int32_t));

	offset += tmp_size;
	memcpy(data+offset, respuesta->sectoresRecorridos, tmp_size = cantidadSectores*sizeof(int32_t));

	stream->length = offset + tmp_size;
	stream->data = data;

	return stream;
}
